package compilador.semantico;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class TabelaSemantica {

	public static enum TiposPrimitivo {
		String, Boolean, Integer, Float, Void;
	}
	
	private static TabelaSemantica instance = new TabelaSemantica();

	public static TabelaSemantica getInstance() {
		return instance;
	}

	private Map<String, Tipo> tipos = new HashMap<String, Tipo>();
	private Map<String, Atributo> temps = new HashMap<String, Atributo>();

	private TabelaSemantica() {
		// construtor privado para o singleton
	}
	
	public boolean ehPrimitivo(String tipo) {
		try {
			TiposPrimitivo.valueOf(tipo);
			return true;
		} catch (IllegalArgumentException e) {
			return false;
		}
	}
	
	public void addTipo(Tipo tipo) {
		this.tipos.put(tipo.getNome(), tipo);
	}

	
	public void addAtributo(Atributo att) {
		this.temps.put(att.getNome(), att);
	}

	public void limpaAtributos() {
		this.temps.clear();
	}

	public Tipo getTipo(String id) {
			return this.tipos.get(id);
	}
	
	public Collection<Tipo> getTipos() {
		Collection<Tipo> result = new ArrayList<Tipo>(this.tipos.size());
		for(String tipo : this.tipos.keySet()) {
			result.add(this.getTipo(tipo));
		}
		
		return result;
	}
	
	public Atributo getTemp(String id) {
		return this.temps.get(id);
	}

	public boolean containsTipo(String id) {
		return this.tipos.containsKey(id);
	}
	
	public boolean containsTemp(String id) {
		return this.temps.containsKey(id);
	}
	
	
	@Override
	public String toString() {
		StringBuilder buf = new StringBuilder();
		for(String key: tipos.keySet()) {
			buf.append("* ");
			buf.append(key);
			buf.append(":\n");
			buf.append(tipos.get(key).toString());
			buf.append('\n');
		}
		return buf.toString();
	}
}
